home *** CD-ROM | disk | FTP | other *** search
- /* Mods by PA0GRI */
-
- #include "global.h"
- #include "mbuf.h"
- #include "internet.h"
- #include "ip.h"
- #include "rspf.h"
-
- #if !defined(_lint)
- static char rcsid[] OPTIONAL = "$Id: rspfhdr.c,v 1.8 1996/08/29 12:11:16 root Exp root $";
- #endif
-
- #ifdef RSPF
-
- /* Convert RRH header in internal format to an mbuf in external format */
- struct mbuf *
- htonrrh (struct rrh *rrh, struct mbuf *data, struct pseudo_header *ph)
- {
- struct mbuf *bp;
- register unsigned char *cp, *ck;
- int16 checksum;
-
- /* Allocate RRH header and fill it in */
- bp = pushdown (data, RRHLEN); /* pushdown never fails */
-
- cp = bp->data;
- *cp++ = uchar (rrh->version); /* Version number */
- *cp++ = RSPF_RRH; /* Type number */
- ck = cp;
- cp = put16 (cp, 0); /* Clear checksum */
- cp = put32 (cp, rrh->addr); /* Source address */
- cp = put16 (cp, rrh->seq); /* Last packet sent sequence number */
- *cp = uchar (rrh->flags); /* Flags */
-
- /* All zeros and all ones is equivalent in one's complement arithmetic;
- * the spec requires us to change zeros into ones to distinguish an
- * all-zero checksum from no checksum at all
- */
- if ((checksum = cksum (ph, bp, ph->length)) == 0)
- /* was checksum = 0xffffffff - odd, since this is an int16! */
- checksum = 0xffff;
- (void) put16 (ck, checksum);
- return bp;
- }
-
-
-
- /* Convert RSPF packet header in internal format to an mbuf in external
- * format, without calculating the checksum.
- */
- struct mbuf *
- htonrspf (struct rspfpacketh *pkth, struct mbuf *data)
- {
- struct mbuf *bp;
- register unsigned char *cp;
-
- /* Allocate packet header and fill it in */
- bp = pushdown (data, RSPFPKTLEN); /* pushdown never fails */
-
- cp = bp->data;
- *cp++ = uchar (pkth->version); /* Version number */
- *cp++ = uchar (pkth->type); /* Type number */
- *cp++ = pkth->fragn; /* The fragment number */
- *cp++ = pkth->fragtot; /* The total number of fragments */
- cp = (unsigned char *) put16 (cp, pkth->csum); /* The checksum */
- *cp++ = pkth->sync; /* The sync octet */
- *cp++ = pkth->nodes; /* The number of nodes */
- (void) put16 (cp, pkth->envid); /* The envelope-ID */
- return bp;
- }
-
-
-
- /* Convert RSPF header in mbuf to internal structure */
- int
- ntohrspf (union rspf *rspf, struct mbuf **bpp)
- {
- if (len_p (*bpp) < RSPFPKTLEN) /* Packet too short */
- return -1;
- if ((rspf->hdr.version = (char) pullchar (bpp)) != RSPF_VERSION) {
- ++Rspf_stat.badvers;
- return -1; /* Wrong version */
- }
- switch (rspf->hdr.type = (char) pullchar (bpp)) {
- case RSPF_RRH:
- if (len_p (*bpp) < RRHLEN - 2) /* Packet too small */
- return -1;
- rspf->rrh.csum = (int16) pull16 (bpp);
- rspf->rrh.addr = pull32 (bpp);
- rspf->rrh.seq = (int16) pull16 (bpp);
- rspf->rrh.flags = (char) pullchar (bpp);
- break;
- case RSPF_FULLPKT:
- rspf->pkthdr.fragn = uchar (pullchar (bpp));
- rspf->pkthdr.fragtot = uchar (pullchar (bpp));
- rspf->pkthdr.csum = (int16) pull16 (bpp);
- rspf->pkthdr.sync = uchar (pullchar (bpp));
- rspf->pkthdr.nodes = uchar (pullchar (bpp));
- rspf->pkthdr.envid = (int16) pull16 (bpp);
- break;
- default:
- return -1;
- }
- return 0;
- }
-
-
-
- /* Convert RSPF node header in internal format to an mbuf in external format */
- struct mbuf *
- htonrspfnode (struct rspfnodeh *nodeh, struct mbuf *data)
- {
- struct mbuf *bp;
- register unsigned char *cp;
-
- /* Allocate node header and fill it in */
- bp = pushdown (data, RSPFNODELEN); /* pushdown never fails */
-
- cp = bp->data;
- cp = put32 (cp, nodeh->addr); /* Reporting router address */
- cp = put16 (cp, (int16) nodeh->seq); /* Sequence number */
- *cp++ = nodeh->subseq; /* Sub-sequence number */
- *cp++ = nodeh->links; /* Number of links */
- return bp;
- }
-
-
-
- /* Convert RSPF node header in mbuf to internal structure */
- int
- ntohrspfnode (struct rspfnodeh *nodeh, struct mbuf **bpp)
- {
- if (len_p (*bpp) < RSPFNODELEN) /* Packet too short */
- return -1;
- nodeh->addr = pull32 (bpp);
- nodeh->seq = (short) pull16 (bpp);
- nodeh->subseq = (unsigned char) pullchar (bpp);
- nodeh->links = (unsigned char) pullchar (bpp);
- return 0;
- }
-
-
-
- /* Convert RSPF link header in internal format to an mbuf in external format */
- struct mbuf *
- htonrspflink (struct rspflinkh *linkh, struct mbuf *data)
- {
- struct mbuf *bp;
- register unsigned char *cp;
-
- /* Allocate link header and fill it in */
- bp = pushdown (data, RSPFLINKLEN); /* pushdown never fails */
-
- cp = bp->data;
- *cp++ = linkh->horizon; /* Horizon */
- *cp++ = linkh->erp; /* ERP factor */
- *cp++ = linkh->cost; /* Link cost */
- *cp++ = linkh->adjn; /* Number of adjacencies */
- return bp;
- }
-
-
-
- /* Convert RSPF link header in mbuf to internal structure */
- int
- ntohrspflink (struct rspflinkh *linkh, struct mbuf **bpp)
- {
- if (len_p (*bpp) < RSPFLINKLEN) /* Packet too short */
- return -1;
- linkh->horizon = (unsigned char) pullchar (bpp);
- linkh->erp = (unsigned char) pullchar (bpp);
- linkh->cost = (unsigned char) pullchar (bpp);
- linkh->adjn = (unsigned char) pullchar (bpp);
- return 0;
- }
-
- #endif /* RSPF */
-